package com.klm.easymq.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * MQ消息监听器注解
 * 用于标记消息消费方法
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MQListener {
    
    /**
     * 消息主题
     */
    String topic();
    
    /**
     * 消费者组
     */
    String group() default "";
    
    /**
     * 幂等键表达式（SpEL）
     * 用于生成幂等控制键
     */
    String idempotentKey() default "";
    
    /**
     * 重试策略
     */
    Retry retryPolicy() default @Retry;
    
    /**
     * 并发消费者数量
     * 默认1个
     */
    int concurrency() default 1;
    
    /**
     * 消息确认模式
     */
    AckMode ackMode() default AckMode.AUTO;
    
    /**
     * 消息确认模式
     */
    enum AckMode {
        /**
         * 自动确认
         */
        AUTO,
        
        /**
         * 手动确认
         */
        MANUAL,
        
        /**
         * 批量确认
         */
        BATCH
    }
} 